package gm.client;

import gm.GmLog;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import jline.ConsoleReader;

/**
 * Kliens.
 *
 * @author imruf84
 */
public class Client {

    /**
     * Port.
     */
    private final int port;

    /**
     * Konstruktor.
     *
     * @param port port
     */
    public Client(int port) {
        this.port = port;
    }

    /**
     * Kliens indítása.
     */
    public void run() {
        try {

            // Cím lekérdezése.
            InetAddress host = InetAddress.getByName("localhost");

            // Konzol előkészítése.
            PrintWriter out = new PrintWriter(System.out);
            ConsoleReader reader = new ConsoleReader();

            reader.setBellEnabled(false);
            String command;
            while ((command = reader.readLine(">")) != null) {
                out.flush();

                if (command.equalsIgnoreCase("quit") || command.equalsIgnoreCase("exit")) {
                    break;
                }

                // Üres paranccsal nem kezdünk semmit.
                if (command.trim().isEmpty()) {
                    continue;
                }
                // Egyébként küldjük a parancsot.
                try (
                        Socket socket = new Socket(host, port);
                        PrintWriter toServer = new PrintWriter(socket.getOutputStream(), true);
                        BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {

                    // Parancs küldése a szervernek.
                    toServer.println(command);

                    // Eredmények fogadása.
                    String response = fromServer.readLine();
                    if (!response.trim().isEmpty()) {
                        System.out.println(response);
                        while ((response = fromServer.readLine()) != null) {
                            System.out.println(response);
                        }
                    }

                    // Kapcsolat bontása.
                    socket.close();

                    // Szerver leállítása esetén is kilépünk.
                    if (command.equalsIgnoreCase("stop")) {
                        break;
                    }

                } catch (UnknownHostException e) {
                    GmLog.printError(e);
                } catch (IOException e) {
                    GmLog.printError(e);
                }

            }
        } catch (IOException ex) {
            GmLog.printError(ex);
        }

    }

}
